/**
 * @name Number of re-commits for each file
 * @description A re-commit is taken to mean a commit to a file that was touched less than five days ago.
 * @kind treemap
 * @id py/historical-number-of-re-commits
 * @treemap.warnOn highValues
 * @metricType file
 * @metricAggregate avg min max
 */

import python
import external.VCS

predicate inRange(Commit first, Commit second) {
    first.getAnAffectedFile() = second.getAnAffectedFile() and
    first != second and
    exists(int n |
        n = first.getDate().daysTo(second.getDate()) and
        n >= 0 and
        n < 5
    )
}

int recommitsForFile(File f) {
    result =
        count(Commit recommit |
            f = recommit.getAnAffectedFile() and
            exists(Commit prev | inRange(prev, recommit))
        )
}

from Module m
where exists(m.getMetrics().getNumberOfLinesOfCode())
select m, recommitsForFile(m.getFile())
